#ifndef WEBSERVER_H
#define WEBSERVER_H
#include <unordered_map>
#include <fcntl.h>
#include <unistd.h>
#include <assert.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <memory>
// IO多路复用、定时器、线程池、http连接
class WebServer
{
public:
    WebServer(int port, int trigMode, int timeoutMs, bool optLinger, int threadNum);
    ~WebServer();
    void Start(); // 一切的开始
private:
    // 初始化服务器的 I/O 事件触发模式
    void _initEventMode(int trigMode);
    // 对服务器的socket进行设置，最后得到listenFd
    bool _initSocket();
    // 添加一个HTTP连接
    void _addClientConnection(int fd, sockaddr_in addr);
    // 关闭一个HTTP连接
    void _closeConn(HTTPconnection *client);
    void _handleListen();
    void _handleWrite(HTTPconnetcion *client);
    void _handleRead(HTTPconnection *client);
    void _onRead(HTTPconnetcion *client);
    void _onWrite(HTTPconnection *client);
    void _onProcess(HTTPconnection *client);
    void _sendError(int fd, const char *info);
    void _extentTime(HTTPconnection *cliten);
    int _port;
    static int setFdNonblock(int fd); // 将监听套接字设置为非阻塞模式
    static const int MAX_FD = 65536;
    int _timeoutMS; // 定时器的默认过期时间
    bool _isClose;
    int _listenFd;
    bool _openLinger;
    char *_srcDir; // 需要获取的路径
    uint32_t _listenEvent;
    uint32_t _connectionEvent;
    std::uniqe_ptr<TimerManager> _timer;
    std::unique_ptr<ThreadPool> _threadpool;
    std::unique_ptr<Epoller> _epoller;
    std::unordered_map<int, HTTPconnetcion> _users;
}

#endif